package com.dkd.manage.service;

import com.dkd.manage.domain.Region;
import com.dkd.manage.domain.vo.RegionVo;
import com.dkd.common.core.domain.TreeSelect;

import java.util.List;
import java.util.Map;

/**
 * 区域管理Service接口
 * 
 * @author daitingwei
 * @date 2025-07-28
 */
public interface IRegionService 
{
    /**
     * 查询区域管理
     * 
     * @param id 区域管理主键
     * @return 区域管理
     */
    public Region selectRegionById(Long id);

    /**
     * 查询区域管理列表
     * 
     * @param region 区域管理
     * @return 区域管理集合
     */
    public List<Region> selectRegionList(Region region);

    /**
     * 新增区域管理
     * 
     * @param region 区域管理
     * @return 结果
     */
    public int insertRegion(Region region);

    /**
     * 修改区域管理
     * 
     * @param region 区域管理
     * @return 结果
     */
    public int updateRegion(Region region);

    /**
     * 批量删除区域管理
     * 
     * @param ids 需要删除的区域管理主键集合
     * @return 结果
     */
    public int deleteRegionByIds(Long[] ids);

    /**
     * 删除区域管理信息
     * 
     * @param id 区域管理主键
     * @return 结果
     */
    public int deleteRegionById(Long id);

    /**
     * 查询区域管理列表
     *
     * @param region 区域管理
     * @return regionVo区域管理集合
     */
    public List<RegionVo> selectRegionVoList(Region region);
    
    /**
     * 构建前端所需要树结构
     * 
     * @param regions 区域列表
     * @return 树结构列表
     */
    public List<Region> buildRegionTree(List<Region> regions);
    
    /**
     * 构建前端所需要下拉树结构
     * 
     * @param regions 区域列表
     * @return 下拉树结构列表
     */
    public List<TreeSelect> buildRegionTreeSelect(List<Region> regions);
    
    /**
     * 获取区域统计信息
     * 
     * @param regionId 区域ID
     * @return 统计信息（节点数量、员工数量）
     */
    public Map<String, Integer> getRegionStatistics(Long regionId);
    
    /**
     * 获取所有区域统计信息
     * 
     * @return 所有区域统计信息（总节点数量、总员工数量）
     */
    public Map<String, Integer> getAllStatistics();
    
    /**
     * 检查区域层级是否超过限制
     * 
     * @param regionId 区域ID
     * @param maxLevel 最大允许层级
     * @return 是否超过限制
     */
    public boolean checkRegionLevelExceeded(Long regionId, int maxLevel);
}
